#!/bin/bash

# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Runs a given test case under a VM.

# This can only run outside the chroot.
. $(dirname "$(readlink -f "$0")")/outside_chroot_common.sh || exit 1
. "${SCRIPT_ROOT}/common.sh" || exit 1
. "${SCRIPT_ROOT}/lib/cros_vm_lib.sh" || die "Unable to load cros_vm_lib.sh"
. "${SCRIPT_ROOT}/lib/cros_vm_constants.sh" ||
  die "Unable to load cros_vm_constants.sh"

DEFINE_string args "" \
    "Command line arguments for test. Quoted and space separated if multiple." a
DEFINE_string board "$DEFAULT_BOARD" \
    "The board for which you built autotest." b
DEFINE_string image_path "" "Full path of the VM image"
DEFINE_string results_dir_root "" "alternate root results directory"
DEFINE_string test_case "" "Name of the test case to run"
DEFINE_boolean use_emerged ${FLAGS_FALSE} \
    "Force use of emerged autotest packages"
DEFINE_integer verbose 1 "{0,1,2} Max verbosity shows autoserv debug output." v
DEFINE_boolean whitelist_chrome_crashes ${FLAGS_FALSE} \
    "Treat Chrome crashes as non-fatal."

set -e

# Returns normally if the given $1 is a valid chrome version.
chrome_version_is_valid() {
  local chrome_version="$1"
  echo ${chrome_version} | egrep '^[0-9]+.[0-9]+.[0-9]+.[0-9]+$' &> /dev/null
}

# Parse command line.
FLAGS "$@" || exit 1

# Use latest if not specified.
if [ -z "${FLAGS_image_path}" ]; then
  LATEST_IMAGE="$("${SCRIPT_ROOT}/get_latest_image.sh" \
      --board=${FLAGS_board})/${DEFAULT_QEMU_IMAGE}"
  info "Using latest vm image ${LATEST_IMAGE}"
  FLAGS_image_path=${LATEST_IMAGE}
fi

[ -e "${FLAGS_image_path}" ] || die "Image ${FLAGS_image_path} does not exist."

if [ -n "${FLAGS_test_case}" ]; then
  warn "Use of --test_case=<test> is being deprecated.  Just pass test names \
as separate command line arguments."
fi

if [ -z "${FLAGS_test_case}" ] && [ -z "${FLAGS_ARGV}" ]; then
  die "You must specify a test case."
fi

test_args=( )
tests_lists=( )
if [[ ${FLAGS_use_emerged} -eq ${FLAGS_TRUE} ]]; then
  die "--use_emerged flag no longer supported by cros_run_vm test. The " \
      "default behavior of test_that is equivalent."
fi
if [[ ${FLAGS_whitelist_chrome_crashes} -eq ${FLAGS_TRUE} ]]; then
  test_args+=(--whitelist-chrome-crashes)
fi
[ -n "${FLAGS_test_case}" ] && test_args+=( "${FLAGS_test_case}" )
for test in ${FLAGS_ARGV}; do
  tests_list+=("$(remove_quotes "${test}")")
done

if [ -n "${FLAGS_board}" ]; then
  test_args+=( "-b" )
  test_args+=( "${FLAGS_board}" )
fi

if [ -n "${FLAGS_args}" ]; then
  test_args+=( "--args" )
  test_args+=( "${FLAGS_args}" )
fi

trap stop_kvm EXIT
start_kvm "${FLAGS_image_path}" "${FLAGS_board}"
retry_until_ssh

echo 'Builder uptime: ' $(uptime)
echo 'Builder meminfo:'
cat /proc/meminfo

${GCLIENT_ROOT}/chromite/bin/cros_sdk -- test_that \
    --no-quickmerge \
    --ssh_options "-F /dev/null -i /dev/null" \
    --debug \
    --results_dir "${FLAGS_results_dir_root}" \
    "${test_args[@]}" \
    127.0.0.1:${FLAGS_ssh_port} \
    "${tests_list}"
